﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ZOVNP.Model.Abstracts
{
    /// <summary> Интерфейс для уведомлений о ходе выполнения некоторого процесса. </summary>
    [Obsolete("IJobsProgressService")]
    public interface IProgressable
    {
        /// <summary> Событие начала выполнения процесса. </summary>
        /// <remarks>
        /// Если значение свойства <c>ProgressType</c> аргументов этого события равно <c>ProgressType.Determinate</c>,
        /// то интерфейс в дальнейшем может генерировать события <c>ProgressChanged</c>, задавая при этом процент
        /// выполнения процесса.
        /// </remarks>
        event EventHandler<ProgressStartedEventArgs> ProgressStarted;
        /// <summary> Событие окончания выполнения процесса. </summary>
        event EventHandler ProgressFinished;
        /// <summary>
        /// Событие изменения текущей операции, выполняемой процессом и, в случае его детерминированности,
        /// процента его завершённости.
        /// </summary>
        event EventHandler<ProgressChangedEventArgs> ProgressChanged;
    }

    /// <summary> Тип выполнения процесса. </summary>
    public enum ProgressType
    {
        /// <summary> Детерминированный. </summary>
        [System.ComponentModel.Description("Детерминированный")]
        Determinate,
        /// <summary> Недетерминированный. </summary>
        [System.ComponentModel.Description("Недетерминированный")]
        Indeterminate
    }

    /// <summary> Класс параметров события начала выполнения процесса. </summary>
    public class ProgressStartedEventArgs : EventArgs
    {
        private readonly ProgressType type;
        private readonly string message;
        public ProgressStartedEventArgs(ProgressType ProgressType, string Message = "")
        {
            type = ProgressType;
            message = Message;
        }
        /// <summary> Тип выполнения процесса. </summary>
        public ProgressType ProgressType { get { return type; } }
        /// <summary> Сообщение о начале выполнения процесса. </summary>
        public string Message { get { return message; } }
    }

    /// <summary> Класс параметров события изменения процента завершённости процесса. </summary>
    public class ProgressChangedEventArgs : EventArgs
    {
        private readonly int percent;
        private readonly string message;
        public ProgressChangedEventArgs(int Percent = 0, string Message = "")
        {
            if (Percent < 0 || Percent > 100) throw new ArgumentOutOfRangeException("Percent", Percent, "Значение должно лежать в диапазоне [0;100].");
            percent = Percent;
            message = Message;
        }
        public ProgressChangedEventArgs(string Message)
        {
            message = Message;
        }
        /// <summary> Процент завершённости процесса. </summary>
        public int Percent { get { return percent; } }
        /// <summary> Сообщение о ходе выполнения процесса. </summary>
        public string Message { get { return message; } }
    }
}
